package com.atguigu.java.ai.langchain4j.tool;
 import com.atguigu.java.ai.langchain4j.entity.Appointment;
 import com.atguigu.java.ai.langchain4j.service.AppointmentService;
 import dev.langchain4j.agent.tool.P;
 import dev.langchain4j.agent.tool.Tool;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 @Component
 public class AppointmentTools {
    @Autowired
    private AppointmentService appointmentService;
     /**
      * 预约挂号功能方法
      * 根据用户提供的预约信息，检查是否可以进行预约，并处理预约请求
      *
      * @param appointment 包含用户预约信息的对象，如科室、预约时间等
      * @return 返回预约结果的字符串信息
      */
     @Tool(name="预约挂号", value = "根据参数，先执行工具方法queryDepartment查询是否可预约，并直接给用户回答是否可预约，并让用户确认所有预约信息，用户确认后再进行预约。如果用户没有提供具体的医生姓名，请从向量存储中找到一位医生。")
     public String bookAppointment(Appointment appointment){
         // 查找数据库中是否包含对应的预约记录
         Appointment appointmentDB = appointmentService.getOne(appointment);
         if(appointmentDB == null){
             // 防止大模型幻觉设置了id，确保插入的是新预约记录
             appointment.setId(null);
             // 尝试保存新的预约记录
             if(appointmentService.save(appointment)){
                 // 保存成功，返回预约成功的消息
                 return "预约成功，并返回预约详情";
             }else{
                 // 保存失败，返回预约失败的消息
                 return "预约失败";
             }
         }
         // 已存在相同的预约记录，提示用户
         return "您在相同的科室和时间已有预约";
     }



     /**
      * 取消预约挂号功能
      * 根据参数，查询预约是否存在，如果存在则删除预约记录并返回取消预约成功，否则返回取消预约失败
      *
      * @param appointment 预约信息对象，包含需要取消的预约的相关信息
      * @return 返回取消预约的结果信息
      */
     @Tool(name="取消预约挂号", value = "根据参数，查询预约是否存在，如果存在则删除预约记录并返回取 消预约成功，否则返回取消预约失败")
     public String cancelAppointment(Appointment appointment){
         // 根据传入的预约信息查询数据库中是否存在该预约记录
         Appointment appointmentDB = appointmentService.getOne(appointment);
         if(appointmentDB != null){
             //删除预约记录
             if(appointmentService.removeById(appointmentDB.getId())){
                 return "取消预约成功";
             }else{
                 return "取消预约失败";
             }
         }
         //取消失败
         return "您没有预约记录，请核对预约科室和时间";
     }


     /**
      * 查询是否有号源功能
      * 根据科室名称、日期、时间和医生名称，查询是否有号源，并返回给用户
      *
      * @param name        科室名称
      * @param date        日期
      * @param time        时间，可选值：上午、下午
      * @param doctorName  医生名称，可选参数，如果不指定医生名称，则根据其他条件查询是否有可以预约的医生
      * @return 返回查询结果，true表示有号源，false表示没有号源
      */
     @Tool(name = "查询是否有号源", value="根据科室名称，日期，时间和医生查询是否有号源，并返回给用户")
     public boolean queryDepartment(
             @P(value = "科室名称") String name,
             @P(value = "日期") String date,
             @P(value = "时间，可选值：上午、下午") String time,
             @P(value = "医生名称", required = false) String doctorName
     ) {
         System.out.println("查询是否有号源");
         System.out.println("科室名称：" + name);
         System.out.println("日期：" + date);
         System.out.println("时间：" + time);
         System.out.println("医生名称：" + doctorName);
         //TODO 维护医生的排班信息：
         //如果没有指定医生名字，则根据其他条件查询是否有可以预约的医生（有返回true，否则返回false）；
         //如果指定了医生名字，则判断医生是否有排班（没有排版返回false）
         //如果有排班，则判断医生排班时间段是否已约满（约满返回false，有空闲时间返回true）
         return true;
     }

 }